////////////////////////////////////////////////////////////////////////////////

#ifndef _SPLAYER_H_
#define _SPLAYER_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _SGAMEOBJECT_H_
#include "sgameobject.h"
#endif

#ifndef _SWEAPON_H_
#include "sweapon.h"
#endif

#ifndef _CLIENTINPUT_H_
#include "clientinput.h"
#endif

#include <list>

////////////////////////////////////////////////////////////////////////////////

class PhysicsEngine;

////////////////////////////////////////////////////////////////////////////////



/** Base class for all players
*
*  @author   Roman Pasechnik
*  @author   Anastasia Karpinska
*  @since    Nov 07th, 2009
*  @updated  Apr 04th, 2010
*/
class SPlayer : public SGameObject
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    SPlayer( int _ID,
             const Point& _position,
             const SWeapon& _weapon );


    /** Destructor */
    virtual ~SPlayer();


////////////////////////////////////////////////////////////////////////////////


    /** Can player shoot or it is reloading */
    bool CanShoot( size_t _dt );


    /** Pull the trigger. Returns bullet */
    SBullet Shoot();


    /** Processes client input, applies impulse to the object if moving */
    void ProcessInput( size_t _dt );


    /** Add health points */
    void AddHealth( int _health );


    /** Returns health points */
    int GetHealthPoints() const;


    /** Reset player to default state */
    void Reset( const Point& _position );


////////////////////////////////////////////////////////////////////////////////


    /** Sets client input */
    void SetClientInput( const ClientInput& _input, size_t _creationTime );


////////////////////////////////////////////////////////////////////////////////
//// Collisions
////////////////////////////////////////////////////////////////////////////////


    /** Informs this object about collision with other object */
    virtual void Collision( SGameObject& _obj );


    /** Informs this object about collision with bullet */
    virtual void CollideWithBullet( SBullet& _bullet );


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Players weapon */
    SWeapon m_Weapon;


    /** Client input */
    ClientInput m_ClientInput;


    /** Last input time from client */
    size_t m_LastInputTime;


    /** Players health points */
    int m_HealthPoint;


////////////////////////////////////////////////////////////////////////////////


    /** Get shoot direction */
    Vector GetShootDirection() const;


////////////////////////////////////////////////////////////////////////////////
};


/** [Utility type]: List of server players */
typedef std::list<SPlayer> SPlayersList;


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////
